package ar.fiuba.tp7552.buildadmin.service.impl;

import java.util.Collection;

import org.springframework.transaction.annotation.Transactional;

import ar.fiuba.tp7552.buildadmin.dao.GenericDao;
import ar.fiuba.tp7552.buildadmin.model.BusinessException;
import ar.fiuba.tp7552.buildadmin.model.builds.TipoPropiedad;
import ar.fiuba.tp7552.buildadmin.model.gastos.Prorrateo;
import ar.fiuba.tp7552.buildadmin.model.gastos.TipoGasto;
import ar.fiuba.tp7552.buildadmin.service.TipoGastoService;

@Transactional
public class TipoGastoServiceImpl implements TipoGastoService {

	private GenericDao<TipoGasto, Long> tgastoDao;
	private GenericDao<TipoPropiedad, Long> tPropDao;
	private GenericDao<Prorrateo, Long> prorrateoDao;
	
	public TipoGastoServiceImpl(GenericDao<TipoGasto, Long> tgastoDao, 
			GenericDao<TipoPropiedad, Long> tPropDao, GenericDao<Prorrateo, Long> prorrateoDao) {
		super();
		this.tgastoDao = tgastoDao;
		this.tPropDao = tPropDao;
		this.prorrateoDao = prorrateoDao;
	}
	
	@Override
	public Collection<TipoGasto> getAll() {
		return tgastoDao.getAll();
	}
	
	@Override
	public Collection<TipoPropiedad> getAllTipoProps() {
		return tPropDao.getAll();
	}

	@Override
	public Prorrateo getProrrateo(Long prorrateoId) {
		return prorrateoDao.get(prorrateoId);
	}
	
	@Override
	public void create(TipoGasto tipoGasto) throws BusinessException {
		tgastoDao.save(tipoGasto);
	}

	@Override
	public TipoGasto get(Long tipoGastoId) {
		return tgastoDao.get(tipoGastoId);
	}

	@Override
	public void update(TipoGasto tipoGasto) {
		tgastoDao.update(tipoGasto);
	}

	@Override
	public void delete(TipoGasto tipoGasto) {
		tgastoDao.remove(tipoGasto.getId());
	}
	
	@Override
	public void asociar(Long tipoGastoId, Long tipoPropId, Double coeficiente) {
		TipoGasto tipoGasto = this.tgastoDao.get(tipoGastoId);
		TipoPropiedad tipoProp = this.tPropDao.get(tipoPropId);
		Prorrateo prorrateo = tipoGasto.asociar(tipoProp, coeficiente);
		if (prorrateo.isNew()) {
			prorrateoDao.save(prorrateo);
		}
	}
	
	@Override
	public void desasociar(Long tipoGastoId, Long tipoPropId) {
		TipoGasto tipoGasto = this.tgastoDao.get(tipoGastoId);
		TipoPropiedad tipoProp = this.tPropDao.get(tipoPropId);
		Prorrateo prorrateo = tipoGasto.desasociar(tipoProp);
		if (prorrateo != null) {
			prorrateoDao.remove(prorrateo.getId());
		}
	}

}
